﻿using QldtSdh.DAL.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace QldtSdh.BLL
{
    public partial class BizDeTai
    {
        internal static List<LoaiDeTai> GetListLoaiDeTai(CEMS4UG_DHKHContext db = null)
        {
            //return new List<LoaiDeTai>() { 
            //    new LoaiDeTai(){MaLoaiDeTai="THAC_SY", TenLoaiDeTai= "Luận văn Thạc sỹ"},
            //    new LoaiDeTai(){MaLoaiDeTai="TIEN_SY", TenLoaiDeTai= "Luận án Tiến sỹ"},
            //    new LoaiDeTai(){MaLoaiDeTai="KHAC", TenLoaiDeTai= "Đề tài NCKH"}
            //};
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext())
                    return GetListLoaiDeTai(db2);
            else
                return db.LoaiDeTaiDbSet.OrderBy(e => e.TenLoaiDeTai).ToList();
        }

        /// <summary>
        /// Lấy danh sách đề tài, lọc theo loại đề tài
        /// loaiDeTai = null -> không lọc theo loại đề tài
        /// </summary>
        /// <param name="loaiDeTai"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        internal static List<DeTai> GetListDeTai(LoaiDeTai loaiDeTai,
            string tuKhoa = "", bool locTheoTenDeTai = false, bool locTheoNguoiThucHien = false, bool locTheoNam = false,
            CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext())
                    return GetListDeTai(loaiDeTai, tuKhoa, locTheoTenDeTai, locTheoNguoiThucHien, locTheoNam, db2);
            else
            {
                string maLoaiDeTai = loaiDeTai == null ? null : loaiDeTai.MaLoaiDeTai;
                bool khongLocTheoMaLoaiDeTai = string.IsNullOrEmpty(maLoaiDeTai);

                var lst = db.DeTaiDbSet.Include("LoaiDeTai")
                    .Where(e =>
                        (e.MaLoaiDeTai == maLoaiDeTai || khongLocTheoMaLoaiDeTai) &&
                        (e.TenDeTai.Contains(tuKhoa) || !locTheoTenDeTai) &&
                        (e.NguoiThucHien.Contains(tuKhoa) || !locTheoNguoiThucHien) &&
                        (e.NamBaoVe == tuKhoa || e.NamThucHien == tuKhoa || !locTheoNam))
                    .ToList();
                return lst;
            }
        }

        internal static void Insert(string p, string tenDeTai, string nguoiThucHien, string maLoaiDeTai, string namThucHien, string namBaoVe, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext())
                    Insert(p, tenDeTai, nguoiThucHien, maLoaiDeTai, namThucHien, namBaoVe, db2);
            else
            {
                var deTai = new DeTai()
                {
                    MaDeTai = p,
                    TenDeTai = tenDeTai,
                    NguoiThucHien = nguoiThucHien,
                    MaLoaiDeTai = maLoaiDeTai,
                    NamThucHien = namThucHien,
                    NamBaoVe = namBaoVe
                };
                db.DeTaiDbSet.Add(deTai);
                BizNhatKyHoatDong.LogAndCommitInsert2(deTai, p, LOAIDOITUONG.ĐỀ_TÀI_LUẬN_VĂN, db);
            }
        }

        internal static void Update(string p, string tenDeTai, string nguoiThucHien, string maLoaiDeTai, string namThucHien, string namBaoVe, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext())
                    Update(p, tenDeTai, nguoiThucHien, maLoaiDeTai, namThucHien, namBaoVe, db2);
            else
            {
                var oDeTai = db.DeTaiDbSet.Where(e => e.MaDeTai == p).FirstOrDefault();
                if (oDeTai == null)
                    throw new Exception("Đề tài không còn tồn tại trên hệ thống");
                var oldDeTai = new DeTai()
                {
                    MaDeTai = oDeTai.MaDeTai,
                    TenDeTai = oDeTai.TenDeTai,
                    NguoiThucHien = oDeTai.NguoiThucHien,
                    MaLoaiDeTai = oDeTai.MaLoaiDeTai,
                    NamThucHien = oDeTai.NamThucHien,
                    NamBaoVe = oDeTai.NamBaoVe
                };
                oDeTai.TenDeTai = tenDeTai;
                oDeTai.NguoiThucHien = nguoiThucHien;
                oDeTai.MaLoaiDeTai = maLoaiDeTai;
                oDeTai.NamThucHien = namThucHien;
                oDeTai.NamBaoVe = namBaoVe;
                BizNhatKyHoatDong.LogAndCommitUpdate2(oldDeTai, oDeTai, p, LOAIDOITUONG.ĐỀ_TÀI_LUẬN_VĂN, db);
            }
        }

        internal static void Delete(string p, CEMS4UG_DHKHContext db = null)
        {
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext())
                    Delete(p, db2);
            else
            {
                var oDeTai = db.DeTaiDbSet.Where(e => e.MaDeTai == p).FirstOrDefault();
                if (oDeTai == null)
                    throw new Exception("Đề tài không còn tồn tại trên hệ thống");
                db.DeTaiDbSet.Remove(oDeTai);
                BizNhatKyHoatDong.LogAndCommitDelete2(oDeTai, p, LOAIDOITUONG.ĐỀ_TÀI_LUẬN_VĂN, db);
            }
        }

        internal static void InsertLoaiDeTai(string maLoaiDeTai, string tenLoaiDeTai)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var tenLoaiDeTai2 = tenLoaiDeTai.ToUpper();
                var oLoaiDeTai = db.LoaiDeTaiDbSet.Where(e => e.TenLoaiDeTai.ToUpper() == tenLoaiDeTai2).FirstOrDefault();
                if (oLoaiDeTai != null)
                    throw new Exception("Đã tồn tại loại đề tài này trên hệ thống");
                oLoaiDeTai = new LoaiDeTai() { MaLoaiDeTai = maLoaiDeTai, TenLoaiDeTai = tenLoaiDeTai };
                db.LoaiDeTaiDbSet.Add(oLoaiDeTai);
                BizNhatKyHoatDong.LogAndCommitInsert2(oLoaiDeTai, maLoaiDeTai, LOAIDOITUONG.LOAI_DE_TAI, db);
            }
        }

        internal static void UpdateLoaiDeTai(string maLoaiDeTai, string tenLoaiDeTai)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var tenLoaiDeTai2 = tenLoaiDeTai.ToUpper();
                var oLoaiDeTai = db.LoaiDeTaiDbSet.Where(e => e.TenLoaiDeTai.ToUpper() == tenLoaiDeTai2 &&
                    e.MaLoaiDeTai != maLoaiDeTai).FirstOrDefault();
                if (oLoaiDeTai != null)
                    throw new Exception("Đã tồn tại loại đề tài này trên hệ thống");
                oLoaiDeTai = db.LoaiDeTaiDbSet.Where(e => e.MaLoaiDeTai == maLoaiDeTai).FirstOrDefault();
                if (oLoaiDeTai == null)
                    throw new Exception("Loại đề tài không còn tồn tại trên hệ thống");
                var oDuLieuCu = new LoaiDeTai() { MaLoaiDeTai = maLoaiDeTai, TenLoaiDeTai = oLoaiDeTai.TenLoaiDeTai };
                oLoaiDeTai.TenLoaiDeTai = tenLoaiDeTai;
                BizNhatKyHoatDong.LogAndCommitUpdate2(oDuLieuCu, oLoaiDeTai, maLoaiDeTai, LOAIDOITUONG.LOAI_DE_TAI, db);
            }
        }

        internal static void DeleteLoaiDeTai(string maLoaiDeTai)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                var oLoaiDeTai = db.LoaiDeTaiDbSet.Where(e => e.MaLoaiDeTai == maLoaiDeTai).FirstOrDefault();
                if (oLoaiDeTai == null)
                    throw new Exception("Loại đề tài không còn tồn tại trên hệ thống");
                db.LoaiDeTaiDbSet.Remove(oLoaiDeTai);
                BizNhatKyHoatDong.LogAndCommitDelete2(oLoaiDeTai, maLoaiDeTai, LOAIDOITUONG.LOAI_DE_TAI, db);
            }
        }

        /// <summary>
        /// Tìm đối tượng LoaiDeTai từ tên loại đề tài
        /// </summary>
        /// <param name="tenLoaiDeTai"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        internal static LoaiDeTai FindLoaiDeTaiByTenLoaiDeTai(string tenLoaiDeTai, CEMS4UG_DHKHContext db = null)
        {
            if (string.IsNullOrEmpty(tenLoaiDeTai))
                return null;
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext()) return FindLoaiDeTaiByTenLoaiDeTai(tenLoaiDeTai, db2);
            else
            {
                tenLoaiDeTai = tenLoaiDeTai.ToLower();
                return db.LoaiDeTaiDbSet.Where(e => e.TenLoaiDeTai.ToLower() == tenLoaiDeTai).FirstOrDefault();
            }
        }

        /// <summary>
        /// Tìm đề tài theo tên
        /// </summary>
        /// <param name="tenDeTai"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        internal static DeTai FindDeTaiByTenDeTai(string tenDeTai, CEMS4UG_DHKHContext db)
        {
            if (string.IsNullOrEmpty(tenDeTai))
                return null;
            if (db == null)
                using (var db2 = CEMS4UG_DHKHContext.GetContext()) return FindDeTaiByTenDeTai(tenDeTai, db2);
            else
            {
                tenDeTai = tenDeTai.ToLower();
                return db.DeTaiDbSet.Where(e => e.TenDeTai.ToLower() == tenDeTai).FirstOrDefault();
            }
        }

        /// <summary>
        /// Xoá nhiều đề tài
        /// </summary>
        /// <param name="lstIDToDeleted">Danh sách các mã đề tài cần xoá</param>
        internal static void Delete(List<string> lstIDToDeleted)
        {
            using (var db = CEMS4UG_DHKHContext.GetContext())
            {
                foreach (var maDeTai in lstIDToDeleted)
                {
                    Delete(maDeTai, db);
                }
            }
        }
    }
}
